﻿using System;
using System.IO;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.GZip;

namespace DoNet.Utils
{
    /// <summary>
    /// 文件的压缩和解压缩
    /// </summary>
    public class ZipFileHelper
    {
        /// <summary>
        /// 使用BZIP压缩文件的方法
        /// </summary>
        /// <param name="sourcefilename"></param>
        /// <param name="zipfilename"></param>
        /// <returns></returns>
        public static bool BZipFile(string sourcefilename, string zipfilename)
        {
            bool blResult;//表示压缩是否成功的返回结果
            //为源文件创建文件流实例，作为压缩方法的输入流参数
            FileStream srcFile = File.OpenRead(sourcefilename);
            //为压缩文件创建文件流实例，作为压缩方法的输出流参数
            FileStream zipFile = File.Open(zipfilename, FileMode.Create);
            try
            {
                //以2048字节作为一个块的方式压缩文件
                BZip2.Compress(srcFile, zipFile, true, 2048);
                blResult = true;
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.Message);
                blResult = false;
            }
            srcFile.Close();//关闭源文件流
            zipFile.Close();//关闭压缩文件流
            return blResult;
        }
        /// <summary>
        /// 使用BZIP解压文件的方法
        /// </summary>
        /// <param name="zipfilename"></param>
        /// <param name="unzipfilename"></param>
        /// <returns></returns>
        public static bool UnBzipFile(string zipfilename, string unzipfilename)
        {
            bool blResult;//表示解压是否成功的返回结果
            //为压缩文件创建文件流实例，作为解压方法的输入流参数
            FileStream zipFile = File.OpenRead(zipfilename);
            //为目标文件创建文件流实例，作为解压方法的输出流参数
            FileStream destFile = File.Open(unzipfilename, FileMode.Create);
            try
            {
                BZip2.Decompress(zipFile, destFile, true);//解压文件
                blResult = true;
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.Message);
                blResult = false;
            }
            destFile.Close();//关闭目标文件流
            zipFile.Close();//关闭压缩文件流
            return blResult;
        }
        /// <summary>
        /// 使用GZIP压缩文件的方法
        /// </summary>
        /// <param name="sourcefilename"></param>
        /// <param name="zipfilename"></param>
        /// <returns></returns>
        public static bool GZipFile(string sourcefilename, string zipfilename)
        {
            bool blResult;//表示压缩是否成功的返回结果
            //为源文件创建读取文件的流实例
            FileStream srcFile = File.OpenRead(sourcefilename);
            //为压缩文件创建写入文件的流实例，
            GZipOutputStream zipFile = new GZipOutputStream(File.Open(zipfilename, FileMode.Create));
            try
            {
                byte[] FileData = new byte[srcFile.Length];//创建缓冲数据
                srcFile.Read(FileData, 0, (int)srcFile.Length);//读取源文件
                zipFile.Write(FileData, 0, FileData.Length);//写入压缩文件
                blResult = true;
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.Message);
                blResult = false;
            }
            srcFile.Close();//关闭源文件
            zipFile.Close();//关闭压缩文件
            return blResult;
        }
        /// <summary>
        /// 使用GZIP解压文件的方法
        /// </summary>
        /// <param name="zipfilename"></param>
        /// <param name="unzipfilename"></param>
        /// <returns></returns>
        public static bool UnGzipFile(string zipfilename, string unzipfilename)
        {
            bool blResult;//表示解压是否成功的返回结果
            //创建压缩文件的输入流实例
            GZipInputStream zipFile = new GZipInputStream(File.OpenRead(zipfilename));
            //创建目标文件的流
            FileStream destFile = File.Open(unzipfilename, FileMode.Create);
            try
            {
                int buffersize = 1024 * 16;//缓冲区的尺寸，一般是1024的倍数
                byte[] FileData = new byte[buffersize];//创建缓冲数据
                while (buffersize > 0)//一直读取到文件末尾
                {
                    buffersize = zipFile.Read(FileData, 0, buffersize);//读取压缩文件数据
                    destFile.Write(FileData, 0, buffersize);//写入目标文件
                }
                blResult = true;
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.Message);
                blResult = false;
            }
            destFile.Close();//关闭目标文件
            zipFile.Close();//关闭压缩文件
            return blResult;
        }
    }
}
